---
title: Service 服务
icon: Blocks
relatedFile: app/src/core/interfaces/Service.tsx
---

类似于 2.0 以前的全局单例 namespace，一个服务只负责一件事情。

> 程序应该只关注一个目标，并尽可能把它做好。——Unix 哲学

## 类型定义

{/* <AutoTypeTable path="../app/src/core/interfaces/Service.tsx" name="Service" /> */}

## 构造函数

调用 Project 的 `loadService` 方法时，会构造一个服务类的实例，并将 Project 对象传入构造函数。

```ts
constructor(project: Project)
```

## 生命周期

服务创建后，如果对象上有 `tick` 方法，则会在每一帧调用 `tick` 方法。

当 Project 对象销毁（即用户关闭文件）时，会调用 `dispose` 方法。

## 依赖其他服务

Project 和 Service 本身不能自动处理依赖，需要在使用 `loadService` 时自行注意加载顺序。

{/* ## 特殊服务

特殊服务类似 VSCode 中 `Provider` 的概念，可以扩展 Project 对象的功能。

### 舞台对象服务

严格来说并不能称作“服务”，因为它并没有为其他服务提供任何功能，只是用来存储数据。

Project 在反序列化舞台对象时，会通过序列化数据中的 `service` 属性找到服务，并构造一个实例，将序列化数据传入。

```ts
constructor(project: Project, data: any)
```

### 文件系统服务

这些服务并非给其他服务提供功能，而是给 Project 提供操作文件系统的能力。

为什么不直接在 Project 中操作文件系统？因为目前的“文件”可以有[不同的协议](/docs/app/v2-changelog#uri)，在 Project 中写每一个协议的代码会非常复杂。

#### 类型定义

TODO: 补充文件系统服务的类型定义 */}
